package bpmn;

import bpmn.structure.*;
import common.SimpleXMLParser;

import java.io.File;
import java.util.HashMap;

public class BPMNParser extends SimpleXMLParser
{
    BPMNHandler handler;
//    BPMNDiagram diagram;

    public BPMNParser(BPMNHandler h)
    {
        super(h);
        IdMap = new HashMap<>();
        handler = h;
    }

    public BPMNDefinition getXmlBPMN()
    {
        return handler.getDefinition();
    }

//    public BPMNDiagram getBPMNDiagram()
//    {
//        return diagram;
//    }

    @Override
    public void parse(String path)
    {
        super.parse(path);
        collectingMap(path);
    }

    @Override
    public void parse(File file)
    {
        super.parse(file);
        collectingMap(file.getName().substring(0, file.getName().length() - 5));
    }

    /**
     * Assuming BPMN has only 1 Process
     */
    private void collectingMap(String fileName)
    {
        BPMNDefinition bpmn = handler.getDefinition();
        bpmn.setFileName(fileName);
        var map = bpmn.elemMap;

        // definition
        map.put(bpmn.id, bpmn);

        // collaboration
        Collaboration c = bpmn.getCollaboration();
        if (c != null)
        {
            map.put(c.id, c);

            // participants
            for (var p : c.getParticipants())
            {
                map.put(p.id, p);
            }
        }

        // process
        for (var p : bpmn.getProcessList())
        {
            map.put(p.id, p);

            // laneSet
            if (p.getLaneSet() != null)
            {
                LaneSet ls = p.getLaneSet();
                map.put(ls.id, ls);

                for (var l : p.getLaneSet().getLanes())
                {
                    // lane
                    map.put(l.id, l);
                }
            }

            // other elements
            for (var e : p.getElements())
            {
                map.put(e.id, e);
            }
        }

//        diagram = new BPMNDiagram();
//        // Pools
//        var list = definition.getProcessList();
//        if (list.size() == 0)
//            errorLog("No Process fund in bpmn definition!");
//        BPMNPool p = new BPMNPool();
//        LaneSet ls = list.get(0).getLaneSet();
//        if (ls == null)
//        {
//            // no pool/participant
//            BPMNLane l = new BPMNLane();
//            p.lanes.add(l);
//            for (var e : list.get(0).getElements())
//            {
//                l.addNode(e.id, e.getParseElement());
//            }
//
//        }

    }
}
